package com.taoyun.service;

import com.taoyun.pojo.entity.File;
import com.taoyun.pojo.entity.ObjectSize;
import com.taoyun.pojo.vo.RecycleFileVO;
import com.taoyun.utils.Response;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 文件业务逻辑处理
 *
 * @author FengJingdong
 */
public interface IFileService{

    /**
     * 删除文件到回收站
     * @param userId
     * @param fileIds
     */
    void putRecycleBin(Integer userId, List<Integer> fileIds);

    /**
     * 回收站恢复文件
     * @param fileIds
     */
    String restoreRecycleBin( List<Integer> fileIds);

    /**
     * 彻底删除文件
     * @param fileIds fileIds
     */
    void deleteFromRecycleBin(List<Integer> fileIds);

    /**
     * 浏览回收站
     * @param userId 用户id
     */
    List<RecycleFileVO> getRecycleBin(Integer userId);

    /**
     * 重命名对象
     * @param objectName
     * @param newObjectName
     * @return
     */
    boolean renameObjects(String objectName,String newObjectName);

    /**
     * 返回可以浏览的链接
     * @param expireSeconds
     * @param objectName
     * @return
     */
    String getObjectLink(long expireSeconds,String objectName);

    /**
     * 在文件并行系统下创建一个桶
     * @param bucketName
     * @throws IOException
     */
    void createFileSystem(String bucketName) throws IOException;


    /**
     * 根据当前路径，模糊查询文件
     * @param now_path
     * @param file_name
     * @return
     */
    List<File> SearchFile_ByName(String now_path, String file_name);

    /**
     * 根据当前路径名，返回当前路径的文件
     * @param now_path
     * @return
     */
    List<File> ShowFile(String now_path);

    /**
     * 根据根目录名，计算用户所用空间大小
     * @param ObjectName
     * @return
     */
    ObjectSize get_user_data(String ObjectName);

    /**
     * 根据根目录名，返回objectSize类
     * @param ObjectName 目录名
     * @return
     */
    ObjectSize objectSize(String ObjectName);

    /**
     * 通过对象名和上传文件的大小，更新ObjectSize表的used_dataSize
     * @param ObjectName
     * @return 成功返回1，否则返回0
     */
    int add_objectData(String ObjectName);

    /**
     * 通过对象名和删除文件的大小，更新ObjectSize表的used_dataSize
     * @param ObjectName
     * @param size
     * @return 成功返回1，否则返回0
     */
    int reduce_objectData(String ObjectName,long size);

    //创建用户时,在ObjectSize表新建行
    int insert_ObjectSize(String ObjectName,long dataSize);

    //创建用户时,在ObjectSize表新建行
    int delete_ObjectSize(String ObjectName);


    /**
     * 判断文件是否存在
     * @param path_Name 传入包含文件名的完整路径名
     * @return
     */
    boolean ifFileExist(String path_Name);

    /**
     * 判断U_Send_F 表关系是否存在
     * @param user_Id 用户id
     * @param file_Id 文件id
     * @return true or false
     */
    boolean ifUSendFExist(int user_Id,int file_Id);

    /**
     * 判断F_belong_G 表关系是否存在
     * @param F_Id 文件id
     * @param GroupId 组id
     * @return
     */
    boolean ifFbelongGExist(int F_Id,int GroupId);

    boolean ifObjectNameExist(String ObjectName);



    /**
     * 使用文件路径名查询用户id
     * @param path_Name
     * @return file_Id
     */
    int selectFileIdByPathName(String path_Name);

    /**
     * 更新USendF表
     * @param user_Id 用户id
     * @param file_Id 文件id
     * @param sendTime 发布时间
     */
    //void updateUSendF(int user_Id,int file_Id,Date sendTime);


    /**
     * 文件上传
     * @param file 表单获取的文件对象
     * @param file_path 当前点及上传按钮时所在的文件路径
     */
    void uploadFile(MultipartFile file, String file_path);

    /**
     * 上传文件更新ObjectSize表
     * @param file
     * @param file_path
     */
    void judgeObjectSizeWhenUpload(MultipartFile file, String file_path);

    /**
     * 上传文件，查表插表操作
     * @param file 文件对象
     * @param file_Path 当前用户目录名
     * @param author 当前用户
     * @param user_Id 当前用户id
     */
    File handleUploadFile(MultipartFile file, String file_Path, String author, int user_Id);

    void insertFileNullFolder(MultipartFile file,String file_Path,String author);

    void insertF_belong_G(int fileId,int groupId,int U_Id);




    /**
     * 下载文件
     * @param bucketName
     * @param objectNames
     * @param fileLocatePrefix
     * @throws IOException
     */
    Response downloadfile(String bucketName, String objectNames, String fileLocatePrefix) throws IOException;



    /**
     * 显示下载文件的下载进度
     * @param bucketName
     * @param objectName

     * @throws IOException
     */
    void downloadprogress(String bucketName,String objectName) throws IOException;


    /**
     * 显示文件的属性
     * @param bucketName
     * @param objectName

     * @throws IOException
     */
    void showobjectName(String bucketName,String objectName) throws IOException;


    /**
     * 移动对象
     * @param sobjectName
     * @param dobjectName
     * @return
     */
    void moveObject(String sobjectName,String dobjectName);

    /**
     * 复制对象
     * @param sobjectName
     * @param dobjectName
     * @return
     */
    void copyObject(String sobjectName,String dobjectName);

    /**
     * 分享对象
     * @param url
     * @param dobject
     * @return
     */
    void shareobject(String url,String dobject);

    /**
     * 获取对象的下载链接
     * @param objectNames
     * @return
     */
    List<String> getDownloadLink(List<String> objectNames);

}
